home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / antenna / yagiu112 / max_side.c < prev    next >
C/C++ Source or Header  |  1995-08-11  |  3KB  |  106 lines

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include "nrutil.h"
  4. #include "yagi.h"
  5.  
  6. /* This routines finds the maximum sidelobe level in the antenna pattern, 
  7. outside the main beam. The fasteest one, find_max_sidelobe_fast is used by
  8. optimise when seeing how clean the pattern is. Its not perfect, but its
  9. fast. 
  10.  
  11. The other one, find_max_sidelobe_slow is much more accurate, doing a good
  12. job of finding the sidelobes, but takes longer to do. Hence its not
  13. really suitable for optimisation, but its okay for 'output' where we dont
  14. care too much about spped. */
  15.  
  16. extern double angular_stepsize_2,min_offset_from_peak;
  17.  
  18. #define BETTER 1
  19. #define WORSE 2
  20.  
  21. #define STEP  1   /* anglur step in degrees */
  22.  
  23. double dB_down_from_peak(double x, double pin, struct  element_data *coordinates, struct FCOMPLEX *current,int elements, double f, double design_f)
  24. {
  25.         double ans,gain_H_plane,peak_gain, gain_at_x;
  26.         gain(90.0, 0.0, pin, f/design_f, coordinates, current, elements, &peak_gain, &gain_H_plane, f, design_f);
  27.         gain(x, 0.000, pin, f/design_f, coordinates, current, elements, &gain_at_x, &gain_H_plane, f, design_f);
  28.         ans=peak_gain-gain_at_x;
  29.         return(ans);
  30. }
  31.  
  32.  
  33. double find_max_sidelobe_slow(double gain, double pin,struct element_data *coordinates, struct FCOMPLEX *current, int elements, double frequency,double design_f)
  34. {
  35.     double nul,level,best=-1000.0,a=90.0,theta,max=1e8;
  36.     int k;
  37.     do{
  38.         a+=STEP; /* Use 1 degree or similar step*/
  39.         level=dB_down_from_peak(a,pin,coordinates,current,elements,frequency,design_f);
  40.         if(level>best)
  41.         {
  42.             k=BETTER;
  43.             best=level;
  44.         }
  45.         else
  46.             k=WORSE;
  47.         }while(k==BETTER && a<=270.0);
  48.     a-=STEP;
  49.     for(theta=a; theta<270.01; theta+=STEP)
  50.     {
  51.         level=dB_down_from_peak(theta,pin,coordinates,current,elements,frequency,design_f);
  52.         if(level<max)
  53.         {
  54.             max=level;
  55.             a=theta;
  56.         }
  57.     }
  58.     return(max);
  59. }
  60.  
  61.  
  62. double find_max_sidelobe_fast(double gain, double pin,struct element_data *coordinates, struct FCOMPLEX *current, int elements, double frequency,double design_f)
  63. {
  64.     double angle=90.0,min_angle,min,max=270,three_dB_point,min_level=1000000.0;
  65.     double level, min_times;
  66.     int N;
  67.  
  68.     if(min_offset_from_peak==0.0)
  69.     {
  70.         three_dB_point=sqrt(41000.0/(pow(10.0,gain/10.0))); 
  71.         if(three_dB_point > 90.0)
  72.             min=180.0;
  73.         else
  74.             min=90.0+(three_dB_point);
  75.     }
  76.     else
  77.         min=90.0+min_offset_from_peak;
  78.     if(angular_stepsize_2==0.0)
  79.         angular_stepsize_2=three_dB_point/30.0; /* step sixe to use - rough */
  80.         /* Since this is only an approximate quick method, you cant expect 
  81.         supeurb accuracy - use _fast if you want that. I'll evaluate at 
  82.         1/10th of the beamwidth, so if the 3dB beamwidth is estimated to be
  83.         40 deg, we will evualate every 4 deg. However, we need to evalate at
  84.         precise 270 degrees, otherwise its possible the max sidelobe will be 
  85.         less than the FB, which is silly. To avoid this, I'll ensure its   
  86.         evaluated at 270 deg, so the step size will be altered to do this. */
  87.    min_times=(max-min)/angular_stepsize_2;
  88.     N=(int) (min_times+1.0);
  89.  
  90.     for(angle=min; angle <=max;angle+=(max-min)/N)
  91.     {
  92.         level=dB_down_from_peak(angle,pin,coordinates,current,elements,frequency,design_f);
  93.         if(level<min_level)
  94.         {
  95.             min_level=level;
  96.             min_angle=angle;
  97.         }
  98.     }
  99.     /* printf("min=%.2lf min_angle=%.2lf angle=%.2lf f=%lf\n ",min_level,min_angle,angle,frequency);  */
  100.     return(min_level);
  101. }
  102.  
  103.  
  104.  
  105.             
  106.